var $root = flatbuffers.get('ort');

$root.onnxruntime = $root.onnxruntime || {};

$root.onnxruntime.fbs = $root.onnxruntime.fbs || {};

$root.onnxruntime.fbs.AttributeType = {
  UNDEFINED: 0,
  FLOAT: 1,
  INT: 2,
  STRING: 3,
  TENSOR: 4,
  GRAPH: 5,
  FLOATS: 6,
  INTS: 7,
  STRINGS: 8,
  TENSORS: 9,
  GRAPHS: 10,
  SPARSE_TENSOR: 11,
  SPARSE_TENSORS: 12,
};

$root.onnxruntime.fbs.Shape = class Shape {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Shape();
    $.dim = reader.tableArray(position, 4, $root.onnxruntime.fbs.Dimension.decode);
    return $;
  }
};

$root.onnxruntime.fbs.Dimension = class Dimension {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Dimension();
    $.value = reader.table(position, 4, $root.onnxruntime.fbs.DimensionValue.decode);
    $.denotation = reader.string_(position, 6, null);
    return $;
  }
};

$root.onnxruntime.fbs.DimensionValueType = {
  UNKNOWN: 0,
  VALUE: 1,
  PARAM: 2,
};

$root.onnxruntime.fbs.DimensionValue = class DimensionValue {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.DimensionValue();
    $.dim_type = reader.int8_(position, 4, 0);
    $.dim_value = reader.int64_(position, 6, 0);
    $.dim_param = reader.string_(position, 8, null);
    return $;
  }
};

$root.onnxruntime.fbs.TensorDataType = {
  UNDEFINED: 0,
  FLOAT: 1,
  UINT8: 2,
  INT8: 3,
  UINT16: 4,
  INT16: 5,
  INT32: 6,
  INT64: 7,
  STRING: 8,
  BOOL: 9,
  FLOAT16: 10,
  DOUBLE: 11,
  UINT32: 12,
  UINT64: 13,
  COMPLEX64: 14,
  COMPLEX128: 15,
  BFLOAT16: 16,
};

$root.onnxruntime.fbs.TensorTypeAndShape = class TensorTypeAndShape {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.TensorTypeAndShape();
    $.elem_type = reader.int32_(position, 4, 0);
    $.shape = reader.table(position, 6, $root.onnxruntime.fbs.Shape.decode);
    return $;
  }
};

$root.onnxruntime.fbs.MapType = class MapType {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.MapType();
    $.key_type = reader.int32_(position, 4, 0);
    $.value_type = reader.table(position, 6, $root.onnxruntime.fbs.TypeInfo.decode);
    return $;
  }
};

$root.onnxruntime.fbs.SequenceType = class SequenceType {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.SequenceType();
    $.elem_type = reader.table(position, 4, $root.onnxruntime.fbs.TypeInfo.decode);
    return $;
  }
};

$root.onnxruntime.fbs.NodeType = {
  Primitive: 0,
  Fused: 1,
};

$root.onnxruntime.fbs.EdgeEnd = class EdgeEnd {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.EdgeEnd();
    $.node_index = reader.uint32(position + 0);
    $.src_arg_index = reader.int32(position + 4);
    $.dst_arg_index = reader.int32(position + 8);
    return $;
  }
};

$root.onnxruntime.fbs.NodeEdge = class NodeEdge {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.NodeEdge();
    $.node_index = reader.uint32_(position, 4, 0);
    $.input_edges = reader.structArray(position, 6, undefined, $root.onnxruntime.fbs.EdgeEnd.decode);
    $.output_edges = reader.structArray(position, 8, undefined, $root.onnxruntime.fbs.EdgeEnd.decode);
    return $;
  }
};

$root.onnxruntime.fbs.Node = class Node {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Node();
    $.name = reader.string_(position, 4, null);
    $.doc_string = reader.string_(position, 6, null);
    $.domain = reader.string_(position, 8, null);
    $.since_version = reader.int32_(position, 10, 0);
    $.index = reader.uint32_(position, 12, 0);
    $.op_type = reader.string_(position, 14, null);
    $.type = reader.int32_(position, 16, 0);
    $.execution_provider_type = reader.string_(position, 18, null);
    $.inputs = reader.strings_(position, 20);
    $.outputs = reader.strings_(position, 22);
    $.attributes = reader.tableArray(position, 24, $root.onnxruntime.fbs.Attribute.decode);
    $.input_arg_counts = reader.typedArray(position, 26, Int32Array);
    $.implicit_inputs = reader.strings_(position, 28);
    return $;
  }
};

$root.onnxruntime.fbs.ValueInfo = class ValueInfo {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.ValueInfo();
    $.name = reader.string_(position, 4, null);
    $.doc_string = reader.string_(position, 6, null);
    $.type = reader.table(position, 8, $root.onnxruntime.fbs.TypeInfo.decode);
    return $;
  }
};

$root.onnxruntime.fbs.TypeInfoValue = class {
  static decode(reader, position, type) {
    switch (type) {
      case 1:
        return $root.onnxruntime.fbs.TensorTypeAndShape.decode(reader, position);
      case 2:
        return $root.onnxruntime.fbs.SequenceType.decode(reader, position);
      case 3:
        return $root.onnxruntime.fbs.MapType.decode(reader, position);
    }
    return undefined;
  }

  static decodeText(reader, json, type) {
    switch (type) {
      case 'TensorTypeAndShape':
        return $root.onnxruntime.fbs.TensorTypeAndShape.decodeText(reader, json);
      case 'SequenceType':
        return $root.onnxruntime.fbs.SequenceType.decodeText(reader, json);
      case 'MapType':
        return $root.onnxruntime.fbs.MapType.decodeText(reader, json);
    }
    return undefined;
  }
};

$root.onnxruntime.fbs.TypeInfo = class TypeInfo {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.TypeInfo();
    $.denotation = reader.string_(position, 4, null);
    $.value = reader.union(position, 6, $root.onnxruntime.fbs.TypeInfoValue.decode);
    return $;
  }
};

$root.onnxruntime.fbs.OperatorSetId = class OperatorSetId {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.OperatorSetId();
    $.domain = reader.string_(position, 4, null);
    $.version = reader.int64_(position, 6, 0);
    return $;
  }
};

$root.onnxruntime.fbs.Tensor = class Tensor {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Tensor();
    $.name = reader.string_(position, 4, null);
    $.doc_string = reader.string_(position, 6, null);
    $.dims = reader.int64s_(position, 8);
    $.data_type = reader.int32_(position, 10, 0);
    $.raw_data = reader.typedArray(position, 12, Uint8Array);
    $.string_data = reader.strings_(position, 14);
    return $;
  }
};

$root.onnxruntime.fbs.SparseTensor = class SparseTensor {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.SparseTensor();
    $.values = reader.table(position, 4, $root.onnxruntime.fbs.Tensor.decode);
    $.indices = reader.table(position, 6, $root.onnxruntime.fbs.Tensor.decode);
    $.dims = reader.int64s_(position, 8);
    return $;
  }
};

$root.onnxruntime.fbs.Attribute = class Attribute {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Attribute();
    $.name = reader.string_(position, 4, null);
    $.doc_string = reader.string_(position, 6, null);
    $.type = reader.int32_(position, 8, 0);
    $.f = reader.float32_(position, 10, 0);
    $.i = reader.int64_(position, 12, 0);
    $.s = reader.string_(position, 14, null);
    $.t = reader.table(position, 16, $root.onnxruntime.fbs.Tensor.decode);
    $.g = reader.table(position, 18, $root.onnxruntime.fbs.Graph.decode);
    $.floats = reader.typedArray(position, 20, Float32Array);
    $.ints = reader.int64s_(position, 22);
    $.strings = reader.strings_(position, 24);
    $.tensors = reader.tableArray(position, 26, $root.onnxruntime.fbs.Tensor.decode);
    $.graphs = reader.tableArray(position, 28, $root.onnxruntime.fbs.Graph.decode);
    return $;
  }
};

$root.onnxruntime.fbs.NodesToOptimizeIndices = class NodesToOptimizeIndices {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.NodesToOptimizeIndices();
    $.node_indices = reader.typedArray(position, 4, Uint32Array);
    $.num_inputs = reader.uint32_(position, 6, 0);
    $.num_outputs = reader.uint32_(position, 8, 0);
    $.has_variadic_input = reader.bool_(position, 10, false);
    $.has_variadic_output = reader.bool_(position, 12, false);
    $.num_variadic_inputs = reader.uint32_(position, 14, 0);
    $.num_variadic_outputs = reader.uint32_(position, 16, 0);
    return $;
  }
};

$root.onnxruntime.fbs.NodeIndexAndKernelDefHash = class NodeIndexAndKernelDefHash {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.NodeIndexAndKernelDefHash();
    $.node_index = reader.uint32_(position, 4, 0);
    $.kernel_def_hash = reader.uint64_(position, 6, 0);
    return $;
  }
};

$root.onnxruntime.fbs.RuntimeOptimizationRecord = class RuntimeOptimizationRecord {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.RuntimeOptimizationRecord();
    $.action_id = reader.string_(position, 4, null);
    $.nodes_to_optimize_indices = reader.table(position, 6, $root.onnxruntime.fbs.NodesToOptimizeIndices.decode);
    $.produced_nodes = reader.tableArray(position, 8, $root.onnxruntime.fbs.NodeIndexAndKernelDefHash.decode);
    return $;
  }
};

$root.onnxruntime.fbs.RuntimeOptimizationRecordContainerEntry = class RuntimeOptimizationRecordContainerEntry {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.RuntimeOptimizationRecordContainerEntry();
    $.optimizer_name = reader.string_(position, 4, null);
    $.runtime_optimization_records = reader.tableArray(
      position,
      6,
      $root.onnxruntime.fbs.RuntimeOptimizationRecord.decode
    );
    return $;
  }
};

$root.onnxruntime.fbs.RuntimeOptimizations = class RuntimeOptimizations {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.RuntimeOptimizations();
    $.records = reader.tableArray(position, 4, $root.onnxruntime.fbs.RuntimeOptimizationRecordContainerEntry.decode);
    return $;
  }
};

$root.onnxruntime.fbs.Graph = class Graph {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Graph();
    $.initializers = reader.tableArray(position, 4, $root.onnxruntime.fbs.Tensor.decode);
    $.node_args = reader.tableArray(position, 6, $root.onnxruntime.fbs.ValueInfo.decode);
    $.nodes = reader.tableArray(position, 8, $root.onnxruntime.fbs.Node.decode);
    $.max_node_index = reader.uint32_(position, 10, 0);
    $.node_edges = reader.tableArray(position, 12, $root.onnxruntime.fbs.NodeEdge.decode);
    $.inputs = reader.strings_(position, 14);
    $.outputs = reader.strings_(position, 16);
    $.sparse_initializers = reader.tableArray(position, 18, $root.onnxruntime.fbs.SparseTensor.decode);
    $.runtime_optimizations = reader.table(position, 20, $root.onnxruntime.fbs.RuntimeOptimizations.decode);
    return $;
  }
};

$root.onnxruntime.fbs.StringStringEntry = class StringStringEntry {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.StringStringEntry();
    $.key = reader.string_(position, 4, null);
    $.value = reader.string_(position, 6, null);
    return $;
  }
};

$root.onnxruntime.fbs.Model = class Model {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.Model();
    $.ir_version = reader.int64_(position, 4, 0);
    $.opset_import = reader.tableArray(position, 6, $root.onnxruntime.fbs.OperatorSetId.decode);
    $.producer_name = reader.string_(position, 8, null);
    $.producer_version = reader.string_(position, 10, null);
    $.domain = reader.string_(position, 12, null);
    $.model_version = reader.int64_(position, 14, 0);
    $.doc_string = reader.string_(position, 16, null);
    $.graph = reader.table(position, 18, $root.onnxruntime.fbs.Graph.decode);
    $.graph_doc_string = reader.string_(position, 20, null);
    $.metadata_props = reader.tableArray(position, 22, $root.onnxruntime.fbs.StringStringEntry.decode);
    return $;
  }
};

$root.onnxruntime.fbs.KernelCreateInfos = class KernelCreateInfos {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.KernelCreateInfos();
    $.node_indices = reader.typedArray(position, 4, Uint32Array);
    $.kernel_def_hashes = reader.uint64s_(position, 6);
    return $;
  }
};

$root.onnxruntime.fbs.SubGraphSessionState = class SubGraphSessionState {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.SubGraphSessionState();
    $.graph_id = reader.string_(position, 4, null);
    $.session_state = reader.table(position, 6, $root.onnxruntime.fbs.SessionState.decode);
    return $;
  }
};

$root.onnxruntime.fbs.SessionState = class SessionState {
  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.SessionState();
    $.kernels = reader.table(position, 4, $root.onnxruntime.fbs.KernelCreateInfos.decode);
    $.sub_graph_session_states = reader.tableArray(position, 6, $root.onnxruntime.fbs.SubGraphSessionState.decode);
    return $;
  }
};

$root.onnxruntime.fbs.InferenceSession = class InferenceSession {
  static identifier(reader) {
    return reader.identifier === 'ORTM';
  }

  static create(reader) {
    return $root.onnxruntime.fbs.InferenceSession.decode(reader, reader.root);
  }

  static decode(reader, position) {
    const $ = new $root.onnxruntime.fbs.InferenceSession();
    $.ort_version = reader.string_(position, 4, null);
    $.model = reader.table(position, 6, $root.onnxruntime.fbs.Model.decode);
    $.session_state = reader.table(position, 8, $root.onnxruntime.fbs.SessionState.decode);
    return $;
  }
};
